/***********************************
* 1、编写一个算法，计算n阶方阵A的
* 两个对角线元素的和。A采用数组表示。
***********************************/
#include<stdio.h>
#include<malloc.h>

typedef long long ll;
typedef struct{int col,row;int* data;} mat;

void print_mat(const mat* m){
    int i,j;
    printf("<Matrix %dx%d>\n",m->row,m->col);
    for(i=0;i<m->col;i++){
        for(j=0;j<m->row;j++)printf("%d\t",(m->data)[i*m->col+j]);
        putchar('\n');
    }
}

ll diags_sum(const mat* m){
    if(m->row!=m->col)return 0;// not square
    int i;
    ll sum = 0;
    for(i=0;i<m->row;i++)sum+=(  (m->data)[i*m->row+i] +  (m->data)[(i+1)*m->row-1-i] );
    if(m->row&1){sum-=(m->data[(m->row/2)*(m->row)+m->row/2]);}
    return sum;
}



int main(){
    int i,j;
    printf("Enter matrix size row x col :");
    scanf("%d%d",&i,&j);
    printf("Enter Matrix by rows:\n");
    mat A;
    A.row = i;
    A.col = j;
    A.data = malloc(sizeof(int)*A.row*A.col);
    for(i =0;i<A.row;i++){
        printf("Row #%d> ",i+1);
        for(j=0;j<A.col;j++){scanf("%d",A.data+i*A.col+j);}fflush(stdin);
    }
    print_mat(&A);
    printf("Sum of both diagonals is: %ld\n",diags_sum(&A));

    free(A.data);
    return 0;
}
